package ar.com.seminario.common.domain.entity;

import java.io.Serializable;

/**
 * Clase utilitaria para entidades identificadas con Identifiable.
 * 
 * @author  Barbalarga & Camarro & Costa Zini & Lamas & Lamas
 */
public final class IdentifiableComparer {

	/**
	 * Constructor privado para evitar su instanciación.
	 */
	private IdentifiableComparer() {

	}

	/**
	 * Verifica si dos objetos son iguales.
	 * 
	 * @param <I> Objeto que implementa un identificador.
	 * @param callerObject Objeto llamador del equals (primer objeto a comparar).
	 * @param anotherObject Segundo objeto a comparar del equals.
	 * @return True si son iguales; caso contrario, False.
	 */
	public static <I extends Identifiable<? extends Serializable>> boolean equals(
	        final I callerObject, final I anotherObject) {

		/* Verificación para evitar problemas de Nulls */
		if (callerObject == null) {
			if (anotherObject != null) {
				/* Simplemente invierte la llamada */
				return (IdentifiableComparer.equals(anotherObject, callerObject));
			} else {
				return (true);
			}
		}

		if (callerObject == anotherObject) {
			return (true);
		}

		if (anotherObject == null) {
			return (false);
		}

		if (callerObject.getClass() != anotherObject.getClass()) {
			return (false);
		}

		final I other = (I) anotherObject;

		if (callerObject.getId() != null && other.getId() != null) {
			return (callerObject.getId().equals(other.getId()));
		}

		return (false);
	}
}
